//
// Created by Jisam on 2024/7/14.
//
#include<bits/stdc++.h>

const int N = 5e2 + 10;
const int INF = 1e9 + 7;

using namespace std;

int a[N][N];
int dp[N][N];

int main() {
    int n;
    cin >> n;

    // 初始化动态规划数组，将所有元素设置为无穷大
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            dp[i][j] = INF;
        }
    }

    // 从输入读取矩阵a的值
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            cin >> a[i][j];
        }
    }

    // 初始化动态规划数组dp的第一个元素
    dp[1][1] = a[1][1];

    // 动态规划填表过程
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            for (int k = 1; k <= n; k++) {
                int d = dp[j][k];
                // 更新d为j列中k之外的最小值
                d = min(d, dp[j][k - 1]);
                d = min(d, dp[j][k + 1]);
                d = min(dp[j - 1][k], d);
                d = min(dp[j + 1][k], d);
                // 确保dp[j][k]是a[j][k]和周围元素的较大值
                dp[j][k] = max(a[j][k], d);
            }
        }
    }
    // 输出结果
    cout << dp[n][n];


    return 0;
}
